package com.guli.gulimall.order;

//import com.alibaba.druid.proxy.jdbc.DataSourceProxyConfig;
//import com.guli.gulimall.order.service.impl.OrderItemServiceImpl;
//import com.guli.gulimall.order.service.impl.OrderServiceImpl;
//import io.seata.spring.annotation.GlobalTransactional;
//import io.seata.spring.boot.autoconfigure.SeataAutoConfiguration;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.aop.framework.AopContext;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.Import;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 使用RabbitMq
 * 1.引入amqp场景； RabbitAutoConfiguration就会自动生效
 * 2.给容器中自动配置了 RabbitTemplate、AmqpAdmin、CachingConnectionFactory、RabbitMessagingTemplate
 *     所有的属性都是在这里进行配置
 * 3.在配置文件中配置spring.rabbitmq 信息
 * 4.@EnableRabbit: 开启RabbitMq
 * 5.监听消息,使用 @RabbitListener，必须要开启@EnableRabbit
 *      @RabbitListener：类+方法上（监听那些队列Queue）
 *      @RabbitHandler：可以标在方法上（可以重载区分不同的消息）
 *
 * todo:注意事务使用代理来实现的，代理增强的是一个service对象，那么同一个对象内事务方法互相调用默认是失败的，原因，绕过了代理对象
 * 本地事务失效问题，解决方案：使用代理对象来调用事务方法
 *  1）引入aop-starter;spring-boot-starter-aop;引入了 aspectj
 *  2) @EnableAspectJAutoProxy(exposeProxy = true) 开启aspectj动态代理功能，并对外暴露代理对象。以后所有的动态代理都是aspectj创建的（即使没有接口也可以创建动态代理）
 *  3) 本类事务方法互调
 *  使用：
 *  @Transactional
 *  publuc void a(){
 *      OrderServiceImpl orderservice =  (OrderServiceImpl)AopContext.currentProxy();
 *      //调用代理方法
 *      orderservice.xx();
 *  }
 *
 *  @Transactional
 *  public void xx(){
 *      //事务方法xx
 *  }
 *
 *
 *  todo seata控制分布式事务：
 *  1.每一个微服务必须创建undo_log 回滚日志表；
 *  2.安装事务协调器；下载 seata-server: https://github.com/seata/seata/releases
 *  3.整合
 *   3.1）common导入依赖 spring-cloud-starter-alibaba-seata  seata-all-1.3.0
 *   3.2）解压启动seata-server 服务器
 *          registry.conf:注册中心配置： 修改registry type=nacos
 *          filec.conf: seata配置
 *   3.3）所有想要用到分布式事务的微服务使用seata DataSourceProxy代理自己的数据源
 *          MySeataConfig.class
 *   3.4) 每个微服务，都必须导入
 *        file.conf
 *        registry.conf
 *   3.5) 在application.properties文件中配置seata分组（｛服务名｝-fescar-service-group）：
 *          spring.cloud.alibaba.seata.tx-service-group={application.name}-fescar-service-group
 *   3.6）给分布式大事务的入口标注全局事务： @GlobalTransactional 注解
 *   3.7）每一个远程分支事务用 @Transactional 注解
 *   3.8) 启动分布式事务
 */
@EnableAspectJAutoProxy(exposeProxy = true) //开启动态代理
@MapperScan("com.guli.gulimall.order.dao")
@SpringBootApplication
@EnableRabbit //开启rabbitmq
@EnableDiscoveryClient
@EnableRedisHttpSession //开启springsession
@EnableFeignClients //开启feign远程调用
public class GulimallOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallOrderApplication.class, args);
    }

}
